/* Libreria di funzioni utilizzate */

typedef struct{
	char *stringa;
	struct stringlist *next;
} stringlist;

stringlist *putsym ();

//putsym è la funzione che mi mette all'interno di una lista il valore che devo dare ad un simbolo

stringlist *putsym ( char *insstring, stringlist **listadaassociare )
{
	stringlist *ptr;
	stringlist *segno;//Variabile temporanea
	segno=*listadaassociare;
	ptr = (stringlist *) malloc (sizeof(stringlist));

	//Assegno il nome dell'assegnazione
	ptr->stringa = (char *) malloc (strlen(insstring)+1);
	strcpy (ptr->stringa,insstring);

	//Assegno il collegamento al nuovo nodo
	ptr->next = (struct stringlist *)0;

	if (*listadaassociare==0){
		*listadaassociare = ptr;
	}
	else {
		while(segno->next!=0){
			segno=(stringlist *)segno->next;
		}
		segno->next=ptr;
	}
	return ptr;
}



int numberOfElm(stringlist *lista){
	int n=0;
	stringlist *temp;//Puntatore che scorre la lista
	temp=lista;
	while(temp!=0){
		n++;
		temp=(stringlist *)temp->next;
	}
	return n;
}

//Questa funzione stampa una lista di stringhe sullo stdout
void *stampastringa(stringlist *lista){
		stringlist *tempacceptlist;
		tempacceptlist=lista;
		while(tempacceptlist!=0){
			printf(tempacceptlist->stringa);
			tempacceptlist=(stringlist *)tempacceptlist->next;
			if(tempacceptlist!=0)
				printf(", ");
		}
}



//Questa funzione stampa una lista di stringhe sul file fp aperto
void *fstampastringa(FILE *fp,stringlist *lista){
		stringlist *tempacceptlist;
		tempacceptlist=lista;
		while(tempacceptlist!=0){
			fprintf(fp,tempacceptlist->stringa);
			tempacceptlist=(stringlist *)tempacceptlist->next;
			if(tempacceptlist!=0)
				fprintf(fp,", ");
		}
}

//Questa funzione stampa una lista di stringhe sul file fp aperto
void *fstampastringaTag(FILE *fp,char tag[], stringlist *lista){
		stringlist *tempacceptlist;
		tempacceptlist=lista;
		while(tempacceptlist!=0){
			fprintf(fp,tag);
			fprintf(fp,tempacceptlist->stringa);
			tempacceptlist=(stringlist *)tempacceptlist->next;
			if(tempacceptlist!=0){
				fprintf(fp,"\n");
			}
		}
}


//Questa funzione elimina le stringhe doppie da una lista di stringhe
void *eliminadoppie ( stringlist *listadaassociare )
{
	stringlist *templista;
	templista=listadaassociare;
	stringlist *tempinterno,*tempPrec;
	while(templista!=0){
		tempinterno=templista->next;
		tempPrec=templista;
		while(tempinterno!=0){
			if(strcmp(tempinterno->stringa,templista->stringa)==0){
				tempPrec->next=tempinterno->next;
				free(tempinterno);
				tempinterno=tempPrec->next;
			} else {
				tempPrec=tempinterno;
				tempinterno=tempinterno->next;//Avanzamento Puntatore
			}
		}
		templista=templista->next;//Avanzamento Puntatore
	}

}
